﻿namespace DimensionsHelper.Common.Contracts.Excel;

/// <summary>
///     此接口表示允许读取和修改Excel工作表的工具类
/// </summary>
public interface IExcelWorksheetOperator
{
    /// <summary>
    ///     获取当前工作表所在的工作簿对象
    /// </summary>
    IExcelWorkbookOperator Workbook { get; }

    /// <summary>
    ///     当前工作表的名称
    /// </summary>
    string Name { get; set; }

    /// <summary>
    ///     获取或设置当前工作表的标签颜色
    /// </summary>
    ExcelStyleColor TabColor { get; set; }

    /// <summary>
    ///     已使用单元格的起始行
    /// </summary>
    int StartRow { get; }

    /// <summary>
    ///     已使用单元格的起始列
    /// </summary>
    int StartColumn { get; }

    /// <summary>
    ///     已使用单元格的结束行
    /// </summary>
    int EndRow { get; }

    /// <summary>
    ///     已使用单元格的结束列
    /// </summary>
    int EndColumn { get; }

    /// <summary>
    ///     配置当前工作表是否显示网格线。
    /// </summary>
    bool ShowGridLines { get; set; }

    /// <summary>
    ///     获取或配置界面缩放比例，此值为百分数，默认值是100。
    /// </summary>
    int Zoom { get; set; }

    /// <summary>
    ///     将此工作表移动到最开始
    /// </summary>
    void MoveToStart();

    /// <summary>
    ///     将此工作表移动到最后
    /// </summary>
    void MoveToEnd();

    /// <summary>
    ///     删除指定行号的行。
    /// </summary>
    /// <param name="row">行号，1开始</param>
    void DeleteRow(int row);

    /// <summary>
    ///     删除指定列号的列。
    /// </summary>
    /// <param name="column">列号，1开始</param>
    void DeleteColumn(int column);

    /// <summary>
    ///     在指定行号前插入一个新行。
    /// </summary>
    /// <param name="row">行号，1开始</param>
    /// <param name="rows">插入的行数</param>
    void InsertRow(int row, int rows = 1);

    /// <summary>
    ///     获取指定行区间对象，此对象不会获取整个行，会截止到工作表最后使用的一列。
    /// </summary>
    /// <param name="row"></param>
    /// <returns></returns>
    IExcelRangeOperator GetRow(int row);

    /// <summary>
    /// 获取当前工作表中所有单元格的值，返回一个二维数组，行数和列数和工作表一致。
    /// 二维数组的行数和列数从1开始，第一行第一列的值为[1, 1]，第二行第二列的值为[2, 2]。
    /// </summary>
    /// <returns></returns>
    object GetValues();

    /// <summary>
    ///     获取指定行、列的单元格的字符串类型内容。
    /// </summary>
    /// <param name="row">行号，1开始</param>
    /// <param name="column">列号，1开始</param>
    /// <returns></returns>
    string GetCellText(int row, int column);

    /// <summary>
    ///     获取指定行、列的单元格区域的<see cref="IExcelRangeOperator" />对象，此对象可能有不同的实现。
    /// </summary>
    /// <param name="row"></param>
    /// <param name="column"></param>
    /// <returns></returns>
    IExcelRangeOperator GetRange(int row, int column);

    /// <summary>
    ///     获取指定起始行、起始列、结束行、结束列的区域<see cref="IExcelRangeOperator" />对象。
    /// </summary>
    /// <param name="fromRow"></param>
    /// <param name="fromColumn"></param>
    /// <param name="toRow"></param>
    /// <param name="toColumn"></param>
    /// <returns></returns>
    IExcelRangeOperator GetRange(int fromRow, int fromColumn, int toRow, int toColumn);

    /// <summary>
    ///     自动匹配所有宽
    /// </summary>
    void AutoFitEntireColumns();

    /// <summary>
    ///     设置所有列的列宽。
    /// </summary>
    /// <param name="width"></param>
    void SetColumnWidth(double width);

    /// <summary>
    ///     设置指定列的列宽。
    /// </summary>
    /// <param name="column"></param>
    /// <param name="width"></param>
    void SetColumnWidth(int column, double width);

    /// <summary>
    ///     设置指定列的文本对齐方式。
    /// </summary>
    /// <param name="column"></param>
    /// <param name="horizontalAlignment">横向对齐样式</param>
    /// <param name="verticalAlignment">纵向对齐样式</param>
    void SetColumnAlignment(int column, ExcelHAlign horizontalAlignment,
        ExcelVAlign verticalAlignment);

    /// <summary>
    ///     设置所有列的文本对齐方式。
    /// </summary>
    /// <param name="horizontalAlignment">横向对齐样式</param>
    /// <param name="verticalAlignment">纵向对齐样式</param>
    void SetColumnAlignment(ExcelHAlign horizontalAlignment, ExcelVAlign verticalAlignment);
}